/*
 * Copyright 2018-10-6 18:56:37 The JA-SIG Collaborative. All rights reserved.
 * distributed with thi file and available online at
 */
package com.lap.scp.erp.controller;

import java.util.Collections;
import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

import com.lap.scd.commons.page.Page;
import com.lap.scd.commons.page.PageResult;
import com.lap.scd.commons.result.Resp;
import com.lap.scp.erp.ao.EmployeeAO;
import com.lap.scp.erp.domain.EmployeeDO;
import com.lap.scp.erp.query.EmployeeQueryVO;

/**
 * <pre>
 *  员工信息，记录员工基本信息，主要是计算统计金额使用，暂时没有什么特别需要控制对象，提供 员工信息，记录员工基本信息，主要是计算统计金额使用，暂时没有什么特别需要 新增,编辑,查询等操作。
 *  控制层统一命名规则：
 *  进入新增 	add,
 *  增加保存 	save,
 *  进入修改 	edit,
 *  修改保存 	update,
 *  查询分页 	queryPage,
 *  根据ID查询 	get,
 *  删除 		deleteById
 *
 * </pre>
 * 
 * @author 劳水生 Exp
 * @Date 2018-10-6 18:56:37
 * @since 2.0.0
 */
@Controller
@RequestMapping("employee")
public class EmployeeController {
	/**
	 * 员工信息，记录员工基本信息，主要是计算统计金额使用，暂时没有什么特别需要应用流程对象
	 */
	@Autowired
	private EmployeeAO employeeAO;

	/**
	 * <pre>
	 * 进入新增员工信息，记录员工基本信息，主要是计算统计金额使用，暂时没有什么特别需要
	 * </pre>
	 * 
	 * @return
	 */
	@GetMapping(value = "add")
	public ModelAndView add() {
		ModelAndView andView = new ModelAndView("erp/employeeEdit");
		andView.addObject("employeeDO", new EmployeeDO());
		return andView;
	}

	/**
	 * <pre>
	 * 新增保存员工信息，记录员工基本信息，主要是计算统计金额使用，暂时没有什么特别需要
	 * </pre>
	 * 
	 * @param employeeDO
	 * @param error
	 * @return
	 */
	@PostMapping(value = "add")
	public ModelAndView add(EmployeeDO employeeDO, BindingResult error) {
		ModelAndView andView = new ModelAndView();

		Resp<EmployeeDO> resp = employeeAO.insertEmployee(employeeDO, error);
		if (resp.isSuccess()) {
			andView.setViewName("redirect:/employee/list");
		} else {
			andView.setViewName("erp/employeeEdit");
			andView.addObject("employeeDO", employeeDO);
			andView.addObject("error", resp.getMsg());
		}
		return andView;
	}

	/**
	 * <pre>
	 * 根据ID删除员工信息，记录员工基本信息，主要是计算统计金额使用，暂时没有什么特别需要
	 * </pre>
	 * 
	 * @param employeeId
	 * @param map
	 * @param attributes
	 * @return
	 */
	@GetMapping(value = "delete/{employeeId}")
	public ModelAndView deleteById(@PathVariable Integer employeeId, @RequestParam Map<String, Object> map,
			RedirectAttributes attributes) {
		ModelAndView andView = new ModelAndView();

		Resp<Integer> resp = employeeAO.deleteById(employeeId);
		if (resp.isSuccess()) {
			andView.setViewName("redirect:/employee/list");
			attributes.addAllAttributes(map);
		} else {
			andView.setViewName("error");
		}
		return andView;
	}

	/**
	 * <pre>
	 * 根据ID查询员工信息，记录员工基本信息，主要是计算统计金额使用，暂时没有什么特别需要
	 * </pre>
	 * 
	 * @param employeeId
	 * @return
	 */
	@GetMapping(value = "get/{employeeId}")
	public ModelAndView get(@PathVariable Integer employeeId) {
		ModelAndView andView = new ModelAndView();
		Resp<EmployeeDO> resp = employeeAO.queryById(employeeId);
		if (resp.isSuccess()) {
			andView.setViewName("erp/employeeDetail");
			andView.addObject("employeeDO", resp.getData());
		} else {
			andView.setViewName("error");
		}
		return andView;
	}

	/**
	 * <pre>
	 * 根据条件、分页信息查询员工信息，记录员工基本信息，主要是计算统计金额使用，暂时没有什么特别需要
	 * </pre>
	 * 
	 * @param page
	 * @param queryVO
	 * @return
	 */
	@RequestMapping(value = "list", method = { RequestMethod.GET, RequestMethod.POST })
	public ModelAndView queryPage(Page page, EmployeeQueryVO queryVO) {
		ModelAndView andView = new ModelAndView();
		PageResult<EmployeeDO> pr = employeeAO.queryPage(page, queryVO);
		if (pr.isSuccess()) {
			andView.setViewName("erp/employeeList");
			andView.addObject("queryVO", queryVO);
			andView.addObject("pr", pr);
		} else {
			andView.setViewName("error");
		}
		return andView;
	}

	/**
	 * <pre>
	 * 进入员工信息，记录员工基本信息，主要是计算统计金额使用，暂时没有什么特别需要 编辑页面
	 * </pre>
	 * 
	 * @param employeeId
	 * @return
	 */
	@GetMapping(value = "edit/{employeeId}")
	public ModelAndView edit(@PathVariable Integer employeeId) {
		ModelAndView andView = new ModelAndView();

		Resp<EmployeeDO> resp = employeeAO.queryById(employeeId);
		if (resp.isSuccess()) {
			andView.setViewName("erp/employeeEdit");
			andView.addObject("employeeDO", resp.getData());
		} else {
			andView.setViewName("error");
		}
		return andView;
	}

	/**
	 * <pre>
	 * 编辑保存员工信息，记录员工基本信息，主要是计算统计金额使用，暂时没有什么特别需要信息
	 * </pre>
	 * 
	 * @param employeeId
	 * @return
	 */
	@PostMapping(value = "edit")
	public ModelAndView edit(EmployeeDO employeeDO, BindingResult error, @RequestParam Map<String, String> map,
			RedirectAttributes attributes) {
		ModelAndView andView = new ModelAndView();

		Resp<Integer> resp = employeeAO.updateEmployee(employeeDO, error);
		if (resp.isSuccess()) {
			andView.setViewName("redirect:/employee/list");
			attributes.addAllAttributes(map);
		} else {
			andView.setViewName("erp/employeeEdit");
			andView.addObject("employeeDO", employeeDO);
			andView.addObject("error", resp.getMsg());
		}
		return andView;
	}

	@GetMapping(value = "queryList")
	@ResponseBody
	public List<EmployeeDO> queryList() {
		Resp<List<EmployeeDO>> resp = employeeAO.queryList();
		if (resp.isSuccess()) {
			return resp.getData();
		} else {
			return Collections.emptyList();
		}
	}

}
